@@ -846,44 +846,45 @@ void Wasm2JSBuilder::addExports(Ref ast, Module* wasm) {
846846}
847847
848848void Wasm2JSBuilder::addGlobal (Ref ast, Global* global) {
849- if (auto * const_ = global->init ->dynCast <Const>()) {
850- Ref theValue;
849+ Ref theVar = ValueBuilder::makeVar ();
850+ ast->push_back (theVar);
851+
852+ auto * init = global->init ;
853+ Ref value;
854+
855+ if (auto * const_ = init->dynCast <Const>()) {
851856 TODO_SINGLE_COMPOUND (const_->type );
852857 switch (const_->type .getBasic ()) {
853858 case Type::i32 : {
854- theValue = ValueBuilder::makeInt (const_->value .geti32 ());
859+ value = ValueBuilder::makeInt (const_->value .geti32 ());
855860 break ;
856861 }
857862 case Type::f32 : {
858- theValue = ValueBuilder::makeCall (
863+ value = ValueBuilder::makeCall (
859864 MATH_FROUND,
860865 makeJsCoercion (ValueBuilder::makeDouble (const_->value .getf32 ()),
861866 JS_DOUBLE));
862867 break ;
863868 }
864869 case Type::f64 : {
865- theValue = makeJsCoercion (
866- ValueBuilder::makeDouble (const_-> value . getf64 ()), JS_DOUBLE);
870+ value = makeJsCoercion (ValueBuilder::makeDouble (const_-> value . getf64 ()),
871+ JS_DOUBLE);
867872 break ;
868873 }
869874 default : {
870875 assert (false && " Top const type not supported" );
871876 }
872877 }
873- Ref theVar = ValueBuilder::makeVar ();
874- ast->push_back (theVar);
875- ValueBuilder::appendToVar (
876- theVar, fromName (global->name , NameScope::Top), theValue);
877- } else if (auto * get = global->init ->dynCast <GlobalGet>()) {
878- Ref theVar = ValueBuilder::makeVar ();
879- ast->push_back (theVar);
880- ValueBuilder::appendToVar (
881- theVar,
882- fromName (global->name , NameScope::Top),
883- ValueBuilder::makeName (fromName (get->name , NameScope::Top)));
878+ } else if (auto * get = init->dynCast <GlobalGet>()) {
879+ value = ValueBuilder::makeName (fromName (get->name , NameScope::Top));
880+ } else if (init->is <RefNull>()) {
881+ value = ValueBuilder::makeName (NULL_);
884882 } else {
885883 assert (false && " Top init type not supported" );
886884 }
885+
886+ ValueBuilder::appendToVar (
887+ theVar, fromName (global->name , NameScope::Top), value);
887888}
888889
889890Ref Wasm2JSBuilder::processFunction (Module* m,
@@ -2415,8 +2416,15 @@ Ref Wasm2JSBuilder::processFunctionBody(Module* m,
24152416 WASM_UNREACHABLE (" unimp" );
24162417 }
24172418 Ref visitRefAs (RefAs* curr) {
2418- unimplemented (curr);
2419- WASM_UNREACHABLE (" unimp" );
2419+ // TODO: support others
2420+ assert (curr->op == RefAsNonNull);
2421+
2422+ // value || trap()
2423+ ABI::wasm2js::ensureHelpers (module , ABI::wasm2js::TRAP);
2424+ return ValueBuilder::makeBinary (
2425+ visit (curr->value , EXPRESSION_RESULT),
2426+ IString (" ||" ),
2427+ ValueBuilder::makeCall (ABI::wasm2js::TRAP));
24202428 }
24212429
24222430 Ref visitContBind (ContBind* curr) {
0 commit comments