diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2009-12-18 15:05:04 +0100 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2009-12-18 15:05:04 +0100 |
commit | 20b945df706b2b9fcbc1a84230372d288d497544 (patch) | |
tree | 0c60abd605dfb4452ba1e866b2bd075f1bd929ef /deps/v8/src/runtime.cc | |
parent | 164ce76e941490e82230e905e719b5b556b669f5 (diff) | |
download | node-new-20b945df706b2b9fcbc1a84230372d288d497544.tar.gz |
Upgrade V8 to 2.0.5
Diffstat (limited to 'deps/v8/src/runtime.cc')
-rw-r--r-- | deps/v8/src/runtime.cc | 105 |
1 files changed, 94 insertions, 11 deletions
diff --git a/deps/v8/src/runtime.cc b/deps/v8/src/runtime.cc index 65dfd1326d..834983344d 100644 --- a/deps/v8/src/runtime.cc +++ b/deps/v8/src/runtime.cc @@ -398,6 +398,82 @@ static Object* Runtime_CreateArrayLiteralBoilerplate(Arguments args) { } +static Object* Runtime_CreateObjectLiteral(Arguments args) { + HandleScope scope; + ASSERT(args.length() == 3); + CONVERT_ARG_CHECKED(FixedArray, literals, 0); + CONVERT_SMI_CHECKED(literals_index, args[1]); + CONVERT_ARG_CHECKED(FixedArray, constant_properties, 2); + + // Check if boilerplate exists. If not, create it first. + Handle<Object> boilerplate(literals->get(literals_index)); + if (*boilerplate == Heap::undefined_value()) { + boilerplate = CreateObjectLiteralBoilerplate(literals, constant_properties); + if (boilerplate.is_null()) return Failure::Exception(); + // Update the functions literal and return the boilerplate. + literals->set(literals_index, *boilerplate); + } + return DeepCopyBoilerplate(JSObject::cast(*boilerplate)); +} + + +static Object* Runtime_CreateObjectLiteralShallow(Arguments args) { + HandleScope scope; + ASSERT(args.length() == 3); + CONVERT_ARG_CHECKED(FixedArray, literals, 0); + CONVERT_SMI_CHECKED(literals_index, args[1]); + CONVERT_ARG_CHECKED(FixedArray, constant_properties, 2); + + // Check if boilerplate exists. If not, create it first. + Handle<Object> boilerplate(literals->get(literals_index)); + if (*boilerplate == Heap::undefined_value()) { + boilerplate = CreateObjectLiteralBoilerplate(literals, constant_properties); + if (boilerplate.is_null()) return Failure::Exception(); + // Update the functions literal and return the boilerplate. + literals->set(literals_index, *boilerplate); + } + return Heap::CopyJSObject(JSObject::cast(*boilerplate)); +} + + +static Object* Runtime_CreateArrayLiteral(Arguments args) { + HandleScope scope; + ASSERT(args.length() == 3); + CONVERT_ARG_CHECKED(FixedArray, literals, 0); + CONVERT_SMI_CHECKED(literals_index, args[1]); + CONVERT_ARG_CHECKED(FixedArray, elements, 2); + + // Check if boilerplate exists. If not, create it first. + Handle<Object> boilerplate(literals->get(literals_index)); + if (*boilerplate == Heap::undefined_value()) { + boilerplate = CreateArrayLiteralBoilerplate(literals, elements); + if (boilerplate.is_null()) return Failure::Exception(); + // Update the functions literal and return the boilerplate. + literals->set(literals_index, *boilerplate); + } + return DeepCopyBoilerplate(JSObject::cast(*boilerplate)); +} + + +static Object* Runtime_CreateArrayLiteralShallow(Arguments args) { + HandleScope scope; + ASSERT(args.length() == 3); + CONVERT_ARG_CHECKED(FixedArray, literals, 0); + CONVERT_SMI_CHECKED(literals_index, args[1]); + CONVERT_ARG_CHECKED(FixedArray, elements, 2); + + // Check if boilerplate exists. If not, create it first. + Handle<Object> boilerplate(literals->get(literals_index)); + if (*boilerplate == Heap::undefined_value()) { + boilerplate = CreateArrayLiteralBoilerplate(literals, elements); + if (boilerplate.is_null()) return Failure::Exception(); + // Update the functions literal and return the boilerplate. + literals->set(literals_index, *boilerplate); + } + return Heap::CopyJSObject(JSObject::cast(*boilerplate)); +} + + static Object* Runtime_CreateCatchExtensionObject(Arguments args) { ASSERT(args.length() == 2); CONVERT_CHECKED(String, key, args[0]); @@ -644,7 +720,7 @@ static Object* Runtime_DeclareGlobals(Arguments args) { // Copy the function and update its context. Use it as value. Handle<JSFunction> boilerplate = Handle<JSFunction>::cast(value); Handle<JSFunction> function = - Factory::NewFunctionFromBoilerplate(boilerplate, context); + Factory::NewFunctionFromBoilerplate(boilerplate, context, TENURED); value = function; } @@ -719,12 +795,15 @@ static Object* Runtime_DeclareContextSlot(Arguments args) { if (*initial_value != NULL) { if (index >= 0) { // The variable or constant context slot should always be in - // the function context; not in any outer context nor in the - // arguments object. - ASSERT(holder.is_identical_to(context)); - if (((attributes & READ_ONLY) == 0) || - context->get(index)->IsTheHole()) { - context->set(index, *initial_value); + // the function context or the arguments object. + if (holder->IsContext()) { + ASSERT(holder.is_identical_to(context)); + if (((attributes & READ_ONLY) == 0) || + context->get(index)->IsTheHole()) { + context->set(index, *initial_value); + } + } else { + Handle<JSObject>::cast(holder)->SetElement(index, *initial_value); } } else { // Slow case: The property is not in the FixedArray part of the context. @@ -4423,8 +4502,11 @@ static Object* Runtime_NewClosure(Arguments args) { CONVERT_ARG_CHECKED(Context, context, 0); CONVERT_ARG_CHECKED(JSFunction, boilerplate, 1); + PretenureFlag pretenure = (context->global_context() == *context) + ? TENURED // Allocate global closures in old space. + : NOT_TENURED; // Allocate local closures in new space. Handle<JSFunction> result = - Factory::NewFunctionFromBoilerplate(boilerplate, context); + Factory::NewFunctionFromBoilerplate(boilerplate, context, pretenure); return *result; } @@ -5140,7 +5222,7 @@ static Object* Runtime_CompileString(Arguments args) { validate); if (boilerplate.is_null()) return Failure::Exception(); Handle<JSFunction> fun = - Factory::NewFunctionFromBoilerplate(boilerplate, context); + Factory::NewFunctionFromBoilerplate(boilerplate, context, NOT_TENURED); return *fun; } @@ -5168,7 +5250,7 @@ static Object* CompileDirectEval(Handle<String> source) { Compiler::DONT_VALIDATE_JSON); if (boilerplate.is_null()) return Failure::Exception(); Handle<JSFunction> fun = - Factory::NewFunctionFromBoilerplate(boilerplate, context); + Factory::NewFunctionFromBoilerplate(boilerplate, context, NOT_TENURED); return *fun; } @@ -7805,7 +7887,8 @@ static Object* Runtime_CollectStackTrace(Arguments args) { HandleScope scope; - int initial_size = limit < 10 ? limit : 10; + limit = Max(limit, 0); // Ensure that limit is not negative. + int initial_size = Min(limit, 10); Handle<JSArray> result = Factory::NewJSArray(initial_size * 3); StackFrameIterator iter; |